package com.ykq.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

@Configuration
public class Oauth2FeignInterceptor implements RequestInterceptor {
    /**
     * 这个方法是拦截后的方法
     * 对每次的远程调用都进行拦截
     * 主要帮我们做token的传递
     * 因为每个资源服务器都需要token
     * 1.浏览器携带token做远程调用  pc-----> A ------>B
     * 2.应用本身自发的请求  mq ---------> B  给一个永久的token  不是每次的远程调用都有requestAttributes
     * 3.支付宝回调你  你在支付宝回调的方法里面 需要远程调用
     *
     * @param template
     */
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (!ObjectUtils.isEmpty(requestAttributes)) {
            //说明是有请求的
            //这个request是之前的request 这个里面有token
            HttpServletRequest request = requestAttributes.getRequest();
            //拿到token bearer
            String authorization = request.getHeader("Authorization");
            if (StringUtils.hasText(authorization)) {
                //传递到下一个request对象中
                template.header("Authorization", authorization);
                return;
            }
        }
        //设置一个永久的token
        template.header("Authorization", "bearer ");
    }
}
